/*
 * libPlanificadorDeDisco.h
 *
 *  Created on: 09/09/2011
 *      Author: utn_so
 */

#ifndef LIBPLANIFICADORDEDISCO_H_
#define LIBPLANIFICADORDEDISCO_H_
#include <stdint.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>

void leerSector(uint32_t, uint16_t, char*);
void escribirSector(uint32_t, uint16_t, char*);
struct {
	uint16_t cilindro;
	uint16_t pista;
	uint16_t sector;
}typedef chs_t;

typedef struct t_correrPedido {
	uint32_t descriptor;
	struct sockaddr_in *remote;
	struct t_nodo *lista;
} t_correrPedido;

typedef struct {
	chs_t dirFisica;
	uint16_t tipo;
	char info[512];
} pedido;

typedef struct t_nroSector {
	chs_t nro;
	char info[512];
	int8_t estado;
	struct t_nroSector *sig;
} t_nroSector;

struct {
	uint16_t tipo;
	uint8_t origen; //esto me dice si viene de la consola o del FS(0/1). Si viene de consola(0) usamos llegarAPosicion. Si viene del FS(1) operamos en el disco.
	uint64_t nroPedido;
	t_nroSector* pila;
	int32_t descriptor;
}typedef t_infoNodo;

typedef struct t_nodo {
	t_infoNodo infoNodo;
	struct t_nodo *sig;
} t_nodo;

struct {
	unsigned char type;
	uint32_t pLength;
	char *payLoad;
}typedef t_paquete;

typedef struct t_dirLogica {
	uint64_t sector;
	struct t_dirLogica *sig;
} t_dirLogica;

typedef struct t_respuesta {
	uint8_t contador;
	int32_t descriptor;
	uint64_t nroPedido;
	struct t_nroSector *listaSectores;
	struct t_respuesta *sig;
} t_respuesta;

typedef struct t_resAlgoritmo{
	t_nodo* nodoLista;
	t_nroSector* nodoPila;
}t_resAlgoritmo;

t_paquete empaquetar(char*);
t_resAlgoritmo starvation(t_nodo **lista);
t_resAlgoritmo noStarvation(t_nodo **lista);
uint16_t buscarTiempo(chs_t posicion);
chs_t aDireccionFisica(uint64_t direccionLogica);
void leerArchivoConfiguracion(char*, char*, char**, char**, char** ID, uint8_t* algoritmo, char **path, uint16_t* flagDeLog, uint16_t* tiempoLectura, chs_t* CHS, uint16_t* tiempoEscritura, uint16_t* RPM, uint16_t* tiempoSaltoPistas);
uint16_t potencia10(uint16_t exponente);
void llegarAPosicion(chs_t cabezal, chs_t pos, chs_t sig);
void insertarEnLista(t_nodo**, t_infoNodo);
void insertaEnListaDir(t_dirLogica** fte, uint64_t nroSector);
void trace(t_nodo**, t_dirLogica*);
void parsearPedido(char*, t_nodo**, int32_t, uint64_t*);
char enteroAChar(uint16_t entero);
void correrAtencionDePedidos(t_correrPedido*);
void planificar(t_nodo **lista);
uint64_t charAInt(char* cadena);
uint64_t potencia(uint16_t base, uint16_t exponente);
void desapilar(t_nroSector** pila, char* info, uint64_t *nro);
void apilar(t_nroSector **pila, char* info, chs_t nro);
char* cargarEstructura(t_infoNodo cafecito);
int8_t verificarPila(t_nroSector* pilaFte);
char* cargarPaqueteRaid(char*,uint64_t,char*,char*);
void senalFin();
void consolar();
#endif /* LIBPLANIFICADORDEDISCO_H_*/
